/*!
 * \file TraderSpi.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief CTP交易SPI回调接口定义
 * 
 * \details 定义了CTP合约加载器的交易SPI回调接口类CTraderSpi
 *          该类继承自CThostFtdcTraderSpi，实现CTP API的各种回调方法
 *          主要用于连接CTP服务器，进行身份验证，登录，并查询所有合约信息
 *          查询到的合约信息将被保存为JSON格式文件供交易系统使用
 *          支持CTP API版本6.3.15
 */

#pragma once
//v6.3.15
#include "../API/CTP6.3.15/ThostFtdcTraderApi.h"

/*!
 * \class CTraderSpi
 * \brief CTP交易SPI回调接口实现类
 * 
 * \details 该类继承自CThostFtdcTraderSpi，实现了CTP交易API的回调接口
 *          主要功能包括：
 *          - 处理与CTP交易前置的连接和断开事件
 *          - 处理身份验证和用户登录响应
 *          - 查询并处理所有合约信息
 *          - 将查询到的合约和品种信息保存为JSON文件
 *          - 错误处理和异常情况处理
 * 
 * \note 该类专门用于合约信息加载，不处理实际的交易业务
 * \see CThostFtdcTraderSpi
 */
class CTraderSpi : public CThostFtdcTraderSpi
{
public:
	/*!
	 * \brief 当客户端与交易后台建立起通信连接时（还未登录前），该方法被调用
	 * 
	 * \details 连接成功后会自动调用身份验证请求
	 */
	virtual void OnFrontConnected();

	/*!
	 * \brief 客户端认证响应
	 * 
	 * \param pRspAuthenticateField 认证响应信息
	 * \param pRspInfo 响应信息结构体，包含错误代码和错误信息
	 * \param nRequestID 请求ID
	 * \param bIsLast 是否为最后一条响应
	 */
	virtual void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

	/*!
	 * \brief 登录请求响应
	 * 
	 * \param pRspUserLogin 用户登录响应信息，包含前置编号、会话编号等
	 * \param pRspInfo 响应信息结构体，包含错误代码和错误信息
	 * \param nRequestID 请求ID
	 * \param bIsLast 是否为最后一条响应
	 */
	virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin,	CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
	
	/*!
	 * \brief 请求查询合约响应
	 * 
	 * \param pInstrument 合约信息结构体，包含合约代码、名称、交易所等详细信息
	 * \param pRspInfo 响应信息结构体，包含错误代码和错误信息
	 * \param nRequestID 请求ID
	 * \param bIsLast 是否为最后一条响应，当为true时表示查询完成，开始保存数据
	 */
	virtual void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);

	/*!
	 * \brief 错误应答
	 * 
	 * \param pRspInfo 响应信息结构体，包含错误代码和错误信息
	 * \param nRequestID 请求ID
	 * \param bIsLast 是否为最后一条响应
	 */
	virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
	
	/*!
	 * \brief 当客户端与交易后台通信连接断开时，该方法被调用
	 * 
	 * \param nReason 错误原因
	 *        0x1001 网络读失败
	 *        0x1002 网络写失败
	 *        0x2001 接收心跳超时
	 *        0x2002 发送心跳失败
	 *        0x2003 收到错误报文
	 * 
	 * \details 当发生这个情况后，API会自动重新连接，客户端可不做处理
	 */
	virtual void OnFrontDisconnected(int nReason);

private:
	/*!
	 * \brief 发送身份验证请求
	 * 
	 * \details 使用配置的AppID和AuthCode进行身份验证
	 */
	void ReqAuth();
	
	/*!
	 * \brief 用户登录请求
	 * 
	 * \details 使用配置的经纪商ID、用户ID和密码进行登录
	 */
	void ReqUserLogin();
	
	/*!
	 * \brief 请求查询合约
	 * 
	 * \details 查询所有可交易的合约信息，包括期货、期权等
	 */
	void ReqQryInstrument();

	/*!
	 * \brief 是否收到成功的响应
	 * 
	 * \param pRspInfo 响应信息结构体
	 * \return true-收到错误响应，false-响应成功
	 */
	bool IsErrorRspInfo(CThostFtdcRspInfoField *pRspInfo);

	/*!
	 * \brief 将查询到的合约和品种信息导出为JSON文件
	 * 
	 * \details 将内存中的合约和品种信息分别保存为contracts.json和commodities.json文件
	 *          供WonderTrader交易系统使用
	 */
	void DumpToJson();

protected:
	int	m_lTradingDate;		/*!< 当前交易日 */
	int m_ReqCount;			/*!< 请求计数器，用于生成唯一的请求ID */
};